package com.fzj.charging.order.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Component
@Slf4j
//@ServerEndpoint创建WebSocket端点
//当客户端连接到路径/ws/server/{userId}时，就会触发WebSocketServer中的相应方法
@ServerEndpoint("/ws/server/{userId}")
public class WebSocketServer {

    private static final ConcurrentHashMap<Integer,Session> sessionMap = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Integer userId){
        log.debug("websocket onOpen");
        sessionMap.put(userId,session);
        log.debug("用户：{}，已上线，连接成功",userId);
    }
    @OnClose
    public void onClose(Session session, @PathParam("userId") Integer userId){
        log.debug("websocket onClose");
        sessionMap.remove(userId,session);
        log.debug("用户：{}，已下线，连接关闭",userId);

    }
    @OnError
    public void onError(Session session,Throwable throwable){
        log.debug("websocket onError");
        log.debug("用户：{}，连接异常",session,throwable);
    }

    @OnMessage
    public void onMessage(Session session,String message){
        log.debug("用户：{}向服务发送消息：{}",session,message);
    }

    /**
     * 向用户发送消息
     * @param userId
     * @param message
     */
    public void sendMessage(Integer userId,String message){
        Session session = sessionMap.get(userId);
        if(session!=null){
            session.getAsyncRemote().sendText(message);
        }else{
            log.debug("用户：{}没有连接",userId);
        }
    }
    /**
     * 主动关闭用户的WebSocket连接
     * @param userId 用户ID
     */
    public void disconnectUser(Integer userId) {
        Session session = sessionMap.get(userId);
        if (session != null && session.isOpen()) {
            try {
                session.close();
                log.debug("用户：{}的连接已被主动关闭", userId);
            } catch (IOException e) {
                log.error("关闭用户：{}的连接时发生错误", userId, e);
            }
        } else {
            log.debug("用户：{}没有打开的连接", userId);
        }
    }

}
